package interfaz;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.security.InvalidKeyException;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class DialogoMensaje extends JDialog
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public final static int NUEVO = 1;

	public final static int REENVIAR = 3;

	public final static int RESPONDER = 2;

	private static final String[] TIPOS = {"normal", "encriptado", "firmado", "firmado-HMAC", "encripatdo-firmado"};

	private JComboBox comboTipos;

	private JTextField de;

	private JTextField para;

	private JTextField asunto;

	private JTextArea areaContenido;

	private InterfazCorreo principal;

	private boolean cancel;

	@SuppressWarnings("null")
	public DialogoMensaje(InterfazCorreo ic, int tipo, Message mensaje, String from) throws MessagingException, InvalidKeyException, IllegalStateException
	{
		super(ic, true);
		principal = ic;

		String contenido = "";
		String strPara = "";
		String strAsunto= "";

		//Acciones por tipo de mensaje enviado
		if(tipo == NUEVO)
		{
			setTitle("Nuevo Mensaje");
		}
		else if(tipo == REENVIAR)
		{
			setTitle("Reenviar mensaje");

			strAsunto = mensaje.getSubject();
			if (strAsunto != null && strAsunto.length() > 0) 
				strAsunto = "FWD: " + strAsunto;
			else 
				strAsunto = "FWD:";

			contenido = "\n----------------- " +
			"MENSAJE REENVIADO" +
			" -----------------\n" + principal.darContenidoMensaje(mensaje);        

		}
		else if (tipo == RESPONDER)
		{
			setTitle("Responder mensaje");

			Address[] receptores = mensaje.getFrom();
			if (receptores != null || receptores.length > 0) 
				strPara = receptores[0].toString();

			if(mensaje.getFrom()[0].toString().indexOf('<') != -1)
			{
				int menor = mensaje.getFrom()[0].toString().indexOf('<');
				int mayor = mensaje.getFrom()[0].toString().indexOf('>');
				String subString = mensaje.getFrom()[0].toString().substring(menor+1, mayor);
				strPara = subString;				
			}
			else
				strPara = mensaje.getFrom()[0].toString();

			strAsunto = mensaje.getSubject();
			if (strAsunto != null && strAsunto.length() > 0) 
				strAsunto = "RE: " + strAsunto;
			else 
				strAsunto = "RE:";

			contenido = "\n----------------- " +
			"RESPUESTA A MENSAJE" +
			" -----------------\n" + principal.darContenidoMensaje(mensaje); 
		}

		//Panel de la informacion para el envio del correo
		JPanel panelInfo = new JPanel();
		GridBagConstraints gbc;
		GridBagLayout layout = new GridBagLayout();
		panelInfo.setLayout(layout);

		JLabel labDesde = new JLabel("De:");
		gbc = new GridBagConstraints();
		gbc.anchor = GridBagConstraints.EAST;
		gbc.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(labDesde, gbc);
		panelInfo.add(labDesde);

		de = new JTextField(from);
		gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.gridwidth = GridBagConstraints.REMAINDER;
		gbc.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(de, gbc);
		panelInfo.add(de);

		JLabel labPara = new JLabel("Para:");
		gbc = new GridBagConstraints();
		gbc.anchor = GridBagConstraints.EAST;
		gbc.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(labPara, gbc);
		panelInfo.add(labPara);

		para = new JTextField(strPara);
		gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.gridwidth = GridBagConstraints.REMAINDER;
		gbc.insets = new Insets(5, 5, 0, 0);
		gbc.weightx = 1.0D;
		layout.setConstraints(para, gbc);
		panelInfo.add(para);

		JLabel labAsunto = new JLabel("Asunto:");
		gbc = new GridBagConstraints();
		gbc.anchor = GridBagConstraints.EAST;
		gbc.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(labAsunto, gbc);
		panelInfo.add(labAsunto);

		asunto = new JTextField(strAsunto);
		gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.gridwidth = GridBagConstraints.REMAINDER;
		gbc.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(asunto, gbc);
		panelInfo.add(asunto);

		gbc = new GridBagConstraints();
		JLabel labTipos = new JLabel("Tipo: ");
		gbc.anchor = GridBagConstraints.EAST;
		gbc.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(labTipos, gbc);
		panelInfo.add(labTipos);

		gbc = new GridBagConstraints();
		comboTipos = new JComboBox(TIPOS);
		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridwidth = GridBagConstraints.REMAINDER;
		gbc.insets = new Insets(5, 5, 0, 0);
		gbc.weightx = 1.0D;
		layout.setConstraints(comboTipos, gbc);
		panelInfo.add(comboTipos);

		if(!comboTipos.getSelectedItem().equals("normal"))
			asunto.setText(strAsunto + " (" + comboTipos.getSelectedItem() + ")");

		//Panel del area de texto
		JScrollPane panelContenido = new JScrollPane();
		areaContenido = new JTextArea(contenido, 15, 50);
		areaContenido.setLineWrap(true);
		panelContenido.setViewportView(areaContenido);

		//panel de los botones
		JPanel panelBotones = new JPanel();
		JButton botEnviar = new JButton("Enviar");
		botEnviar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				verificarEnviar();
			}
		});
		panelBotones.add(botEnviar);

		JButton botCancelar = new JButton("Cancelar");
		botCancelar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				cancel = true;
				dispose();
			}
		});
		panelBotones.add(botCancelar);

		setLayout(new BorderLayout());
		add(panelInfo, BorderLayout.NORTH);
		add(panelContenido, BorderLayout.CENTER);
		add(panelBotones, BorderLayout.SOUTH);

		pack();
		centrarVentana();
	}

	public String getDe()
	{
		return de.getText();
	}

	public String getPara()
	{
		return para.getText();
	}

	public String getAsunto()
	{
		return asunto.getText();
	}

	public String getContenido()
	{
		return areaContenido.getText();
	}

	public boolean isCanceled()
	{
		return cancel;
	}
	
	public String getTipo()
	{
		return (String) comboTipos.getSelectedItem();
	}

	private void verificarEnviar() {
		if (de.getText().trim().length() < 1
				|| para.getText().trim().length() < 1
				|| asunto.getText().trim().length() < 1
				|| areaContenido.getText().trim().length() < 1) {
			JOptionPane.showMessageDialog(this,
					"Por favor llene todos los campos",
					"Campos imcompletos", JOptionPane.ERROR_MESSAGE);
			return;
		}

		dispose();
	}

	/**
	 * Centra la ventana en la pantalla
	 */
	private void centrarVentana( )
	{
		Dimension pantalla = Toolkit.getDefaultToolkit( ).getScreenSize( );
		setLocation( ( int ) ( pantalla.getWidth( ) / 2 - getWidth( ) / 2 ), ( int ) ( pantalla.getHeight( ) / 2 - getHeight( ) / 2 ) );
	}
}
